home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / quicspool / libtrw / getopt.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  2KB  |  62 lines

  1. static char *rcs = "$Header: getopt.c,v 1.1 88/01/15 12:56:30 simpson Rel $";
  2. /*
  3. $Log:    getopt.c,v $
  4.  * Revision 1.1  88/01/15  12:56:30  simpson
  5.  * initial release
  6.  * 
  7.  * Revision 0.1  87/12/11  17:14:09  simpson
  8.  * beta test
  9.  * 
  10. */
  11. #include <stdio.h>
  12.  
  13. /*
  14.  * get option letter from argument vector
  15.  */
  16. int    opterr = 1,        /* useless, never set or used */
  17.     optind = 1,        /* index into parent argv vector */
  18.     optopt;            /* character checked for validity */
  19. char    *optarg;        /* argument associated with option */
  20.  
  21. #define BADCH    (int)'?'
  22. #define EMSG    ""
  23. #define tell(s)    fputs(*nargv,stderr);fputs(s,stderr); \
  24.         fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);
  25.  
  26. getopt(nargc,nargv,ostr)
  27. int    nargc;
  28. char    **nargv,
  29.     *ostr;
  30. {
  31.     static char    *place = EMSG;    /* option letter processing */
  32.     register char    *oli;        /* option letter list index */
  33.     char    *index();
  34.  
  35.     if(!*place) {            /* update scanning pointer */
  36.         if(optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return(EOF);
  37.         if (*place == '-') {    /* found "--" */
  38.             ++optind;
  39.             return(EOF);
  40.         }
  41.     }                /* option letter okay? */
  42.     if ((optopt = (int)*place++) == (int)':' || !(oli = index(ostr,optopt))) {
  43.         if(!*place) ++optind;
  44.         tell(": illegal option -- ");
  45.     }
  46.     if (*++oli != ':') {        /* don't need argument */
  47.         optarg = NULL;
  48.         if (!*place) ++optind;
  49.     }
  50.     else {                /* need an argument */
  51.         if (*place) optarg = place;    /* no white space */
  52.         else if (nargc <= ++optind) {    /* no arg */
  53.             place = EMSG;
  54.             tell(": option requires an argument -- ");
  55.         }
  56.          else optarg = nargv[optind];    /* white space */
  57.         place = EMSG;
  58.         ++optind;
  59.     }
  60.     return(optopt);            /* dump back option letter */
  61. }
  62.